﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Comissoes.Utilities;

namespace Comissoes.Models
{
    public class ProdutosModel
    {
        public PRODUTOS produto { get; set; }
        private xcontEntities db = new xcontEntities();

        private List<string> erros;
        public SelectList Origem { get; private set; }
        public SelectList Tipo { get; private set; }
        public SelectList ID_UNID { get; private set; }
        public SelectList ID_UNID_EMB { get; private set; }
        public SelectList ID_NCM { get; private set; }
        public SelectList ID_SERV { get; private set; }

        public ProdutosModel()
        {
            PRODUTOS produto = new PRODUTOS();
            this.produto = produto;

            this.CreateSelectList();
        }

        public ProdutosModel(Int32? id)
        {
            this.produto = db.PRODUTOS.Include("UNIDADES").FirstOrDefault(t => t.COD_PROD == id);

            this.CreateSelectList();
        }
        
        public List<string> UpdateValidate(HttpRequestBase request)
        {
            this.erros = new List<string>();

            String COD_PROD = request["COD_PROD"],
                   ID_UNID = request["ID_UNID"],
                   DESC_PROD = request["DESC_PROD"];

            if (string.IsNullOrEmpty(COD_PROD))
                erros.Add("É necessário informar o código do produto.");

            if (string.IsNullOrEmpty(ID_UNID))
                erros.Add("É necessário informar o tipo de unidade.");

            if (string.IsNullOrEmpty(DESC_PROD))
                erros.Add("É necessário informar a descrição do produto.");

            else if (db.PRODUTOS.Any(t => t.DESC_PROD == DESC_PROD && t.COD_PROD != this.produto.COD_PROD))
                erros.Add("Já existe um produto cadastrado com esta descrição no momento.");

            return erros;
        }

        public List<string> UpdateDetails(FormCollection form)
        {
            this.erros = new List<string>();

            try
            {
                this.produto.ICMS_PROD = Convertions.Inteiro(form["ICMS_PROD"]);
                this.produto.II_PROD = Convertions.Inteiro(form["II_PROD"]);
                this.produto.IPI_PROD = Convertions.Inteiro(form["IPI_PROD"]);
                this.produto.IPIPESO_PROD = Convertions.Decimal(form["IPIPESO_PROD"]);
                this.produto.ISSQN_PROD = Convertions.Decimal(form["ISSQN_PROD"]);
                this.produto.CST_PROD = form["Origem"] + form["Tipo"];
                this.produto.CF_PROD = form["CF_PROD"];

                this.produto.ALTURA_PROD = Convertions.Inteiro(form["ALTURA_PROD"]);
                this.produto.LARGURA_PROD = Convertions.Inteiro(form["LARGURA_PROD"]);
                this.produto.COMPR_PROD = Convertions.Inteiro(form["COMPR_PROD"]);
                this.produto.CUSTO_PROD = Convertions.Decimal(form["CUSTO_PROD"]);
                this.produto.MARGEM_PROD = Convertions.Decimal(form["MARGEM_PROD"]);
                this.produto.PRECO_PROD = Convertions.Decimal(form["PRECO_PROD"]);
                this.produto.VALIDADE_PROD = Convertions.Inteiro(form["VALIDADE_PROD"]);
                this.produto.PESOBRT_PROD = Convertions.Decimal(form["PESOBRT_PROD"]);
                this.produto.PESOLIQ_PROD = Convertions.Decimal(form["PESOLIQ_PROD"]);
                this.produto.QTDEMB_PROD = Convertions.Decimal(form["QTDEMB_PROD"]);

                Int32? IDNCM = Convertions.Inteiro(form["IDNCM"]);
                this.produto.NCM = db.NCM.FirstOrDefault(t => t.ID_NCM == IDNCM);

                Int32? IDUNIDEMB = Convertions.Inteiro(form["ID_UNID_EMB"]);
                this.produto.UNIDADES1 = db.UNIDADES.FirstOrDefault(t => t.ID_UNID == IDUNIDEMB);

                db.SaveChanges();
            }
            catch (Exception ex)
            {
                erros.Add(ex.Message);
                if (ex.InnerException != null)
                    erros.Add(ex.InnerException.Message);
            }

            return erros;
        }

        public List<string> Update(HttpRequestBase request)
        {
            this.erros = new List<string>();

            try
            {
                Int32 ID_UNID = Int32.Parse(request["ID_UNID"]);

                if (db.PRODUTOS.Any(t => t.COD_PROD == this.produto.COD_PROD))
                    this.produto = db.PRODUTOS.FirstOrDefault(t => t.COD_PROD == this.produto.COD_PROD);

                else
                {
                    Int32 COD_PROD = Int32.Parse(request["COD_PROD"]);
                    this.produto.COD_PROD = COD_PROD;
                    db.AddToPRODUTOS(this.produto);
                }

                this.produto.DESC_PROD = request["DESC_PROD"];
                this.produto.DESCRED_PROD = request["DESCRED_PROD"];
                this.produto.OBS_PROD = request["OBS_PROD"];
                this.produto.ATIVO_PROD = request["ATIVO_PROD"].Contains("true") ? "A" : "B";
                this.produto.UNIDADES = db.UNIDADES.FirstOrDefault(t => t.ID_UNID == ID_UNID);

                db.SaveChanges();
            }
            catch (Exception ex)
            {
                erros.Add(ex.Message);
                if (ex.InnerException != null)
                    erros.Add(ex.InnerException.Message);
            }

            return erros;
        }

        public List<string> Delete()
        {
            this.erros = new List<string>();

            if (!erros.Any())
            {
                try
                {
                    db.DeleteObject(db.PRODUTOS.FirstOrDefault(t => t.COD_PROD == this.produto.COD_PROD));
                    db.SaveChanges();
                }
                catch (Exception ex)
                {
                    erros.Add(ex.Message);
                }
            }

            return erros;
        }

        private void CreateSelectList()
        {
            if (this.produto.UNIDADES == null)
                this.ID_UNID = new SelectList(db.UNIDADES, "ID_UNID", "COD_UNID");
            else
                this.ID_UNID = new SelectList(db.UNIDADES, "ID_UNID", "COD_UNID", this.produto.UNIDADES.ID_UNID);

            if (this.produto.UNIDADES1 == null)
                this.ID_UNID_EMB = new SelectList(db.UNIDADES, "ID_UNID", "COD_UNID");
            else
                this.ID_UNID_EMB = new SelectList(db.UNIDADES, "ID_UNID", "COD_UNID", this.produto.UNIDADES1.ID_UNID);

            if (this.produto.NCM == null)
                this.ID_NCM = new SelectList(db.NCM, "ID_NCM", "DESC_NCM");
            else
                this.ID_NCM = new SelectList(db.NCM, "ID_NCM", "DESC_NCM", this.produto.NCM.ID_NCM);

            var servicos = from c in db.SERVICOS
                           select new
                           {
                               c.ID_SERV,
                               COD_SERV = c.COD_SERV + " - " + c.DESC_SERV
                           };

            if (this.produto.SERVICOS == null)
                this.ID_NCM = new SelectList(servicos, "ID_SERV", "COD_SERV");
            else
                this.ID_NCM = new SelectList(servicos, "ID_SERV", "COD_SERV", this.produto.SERVICOS.ID_SERV);

            List<SelectListItem> Tipo = new List<SelectListItem> {
                new SelectListItem { Value = "00", Text = "Integral" },
                new SelectListItem { Value = "10", Text = "Substituição tributária" },                
                new SelectListItem { Value = "20", Text = "Redução da base de cálculo" },
                new SelectListItem { Value = "30", Text = "Isenta com substituição tributária" },
                new SelectListItem { Value = "40", Text = "Isenta" },
                new SelectListItem { Value = "51", Text = "Não tributada" },                
                new SelectListItem { Value = "50", Text = "Suspensão" },
                new SelectListItem { Value = "51", Text = "Diferimento" },
                new SelectListItem { Value = "60", Text = "Cobrado anteriormente por substiuição tributária" },
                new SelectListItem { Value = "70", Text = "Redução da base de cálculo e cobrança por substiuição tributária" },                
                new SelectListItem { Value = "90", Text = "Outras" }
            };

            List<SelectListItem> Origem = new List<SelectListItem> {
                new SelectListItem { Value = "0", Text = "Nacional" },
                new SelectListItem { Value = "1", Text = "Estrangeira - Importação direta" },
                new SelectListItem { Value = "2", Text = "Entrangeira - Adquirida no mercado interno" }
            };

            if (String.IsNullOrEmpty(this.produto.CST_PROD))
            {
                this.Origem = new SelectList(Origem, "Value", "Text");
                this.Tipo = new SelectList(Tipo, "Value", "Text");
            }
            else
            {
                this.Origem = new SelectList(Origem, "Value", "Text", this.produto.CST_PROD.Substring(0, 1));
                this.Tipo = new SelectList(Tipo, "Value", "Text", this.produto.CST_PROD.Substring(1, 2));
            }
        }
    }
}
